/*************************************************************************
	> File Name: linklist.h
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月09日 星期一 21时26分18秒
 ************************************************************************/

#ifndef _LINKLIST_H
#define _LINKLIST_H

//计算偏移量
//首先定义一个T结构体类型的空指针
//通过间接引用运算符->name得到name字段相对于结构体首个成员地址的偏移量
//因为64位系统中每个指针的长度为8字节，与long long类型变量的长度相同
//将这个偏移量（字节数）转换成一个longlong类型的整数用于后续的计算
#define offset(T, name) (long long)(&(((T *)(NULL))->name))

//传入LinkNode结构体类型的指针p，待求结构体的类型T，待求结构体字段的名字name
//p指向的是下一个结构体的LinkNode结构体指针的地址
//先将p转换成为char类型的指针，这样方便计算偏移量
//通过offset宏求出了下一个结构体中的name字段相对于结构体首成员地址（也就是结构体地址）
//再将这个地址转换成T结构体类型的指针
#define Head(p, T, name) (T *)((char *)(p) - offset(T, name))

struct LinkNode {
    struct LinkNode *next;
};

#endif
